package myServer.session;

import component.userInformation.UserAttribute;
import lombok.Data;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Data
public class SessionMap {

    public static SessionMap singleInstance = new SessionMap();
    //会话 map,键值对 <ServerSession唯一标识 , ServerSession>
    private ConcurrentHashMap<String, ServerSession> map = new ConcurrentHashMap<>();

    private SessionMap() {

    }

    /**
     * 单例
     */
    public static SessionMap instance() {
        return singleInstance;
    }

    /**
     * 添加 session对象，键值对 (ServerSession唯一标识 , ServerSession)
     */
    public void addSession(ServerSession session) {
        map.put(session.getServerSessionID(), session);
        System.out.println("用户登录： id = " + session.getUserAttribute().getUid()
                + " 在线人数: " + map.size());
    }

    /**
     * 移除 session
     */
    public void removeSession(String sessionID) {
        if (!map.containsKey(sessionID)) {
            return;
        }
        ServerSession session = map.get(sessionID);
        map.remove(sessionID);
        System.out.println("用户下线:id= " + session.getUserAttribute().getUid()
                + "   在线总数: " + map.size());
    }

    /**
     * 根据 ServerSession ID，获取 ServerSession对象
     */
    public ServerSession getServerSession(String sessionID) {
        return map.getOrDefault(sessionID, null);
    }

    /**
     * 过滤同一用户所有的在线方式。用户可以从不同终端设备登录。
     */
    public List<ServerSession> getServerSessionsByUserID(String userID) {
        return map.values()
                .stream()
                .filter(session -> session.getUserAttribute().getUid().equals(userID))
                .toList();
    }

    /**
     * 判断该用户是否通过其他终端登录
     */
    public boolean isLoginByOtherPlatform(UserAttribute userAttribute) {
        for (Map.Entry<String, ServerSession> next : map.entrySet()) {
            UserAttribute userAttribute1 = next.getValue().getUserAttribute();
            if (userAttribute1.getUid().equals(userAttribute.getUid())
                    && userAttribute1.getPlatform().equals(userAttribute.getPlatform())) {
                return true;
            }
        }
        return false;
    }

}
